[小ネタ]dbt-databricksでINCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERNエラーが発生したときの対処方法

[小ネタ]dbt-databricksでINCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERNエラーが発生したときの対処方法

Clock Icon2024.12.18

データ事業本部のueharaです。

今回は、dbt-databricksINCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERN エラーが発生したときの対処方法を紹介したいと思います。

そもそも何のエラーか?

例えば、dbt-databricksで TO_DATE(date_str, 'YYYY-MM-dd') というようなクエリを実行しようとすると、以下のエラーが発生します。

[INCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERN] You may get a different result due to the upgrading to Spark >= 3.0:
All week-based patterns are unsupported since Spark 3.0, detected week-based character: Y.
Please use the SQL function EXTRACT instead.

原因について結論から言うと、Spark 3.0以上から 週ベースの年を表す大文字の Y はサポートされていないためになります。

解決方法

まず、自分が扱いたい年が本当に「週ベースの年」であるか確認する必要があります。

週ベースの年とは、ISO 8601で定義される年の表記方法の1つで、1年を52週または53週で区切って考える方法です(1月1日に最も近い最初の月曜日から始まる=1年の始まりは 12/29〜1/4 の間となる)。

したがって、暦年(1月1日〜12月31日)とは異なる場合がでてきます。

Databricksの Datetime patterns に記載のあるように、通常の年(暦年)を表したい場合は TO_DATE(date_str, 'yyyy-MM-dd') のように 小文字の y を利用する必要があります。

本質として、Yy は扱いが異なっています。

その他補足

補足1

真に週ベースの年である Y を利用したい場合は、以下のようにレガシーオプションを設定することもできます。

SET legacy_time_parser_policy = legacy;

ただし、推奨される方法ではないのでご留意ください。(※ Y を使わない方向でクエリを修正するべき)

補足2

大文字の D と 小文字の d についても同じく扱いが異なります。

大文字の Dday-of-year、つまり1年の通算日であり、小文字の dday-of-month つまり月の日を表します。

したがって、例えば TO_DATE('2024-12-18', 'YYYY-MM-DD') という書式は期待する動作と異なる書式の指定であり、 TO_DATE('2024-12-18', 'yyyy-MM-dd') という書式が正しいものになります。

最後に

今回は、dbt-databricksINCONSISTENT_BEHAVIOR_CROSS_VERSION.DATETIME_WEEK_BASED_PATTERN エラーが発生したときの対処法を紹介してみました。

参考になりましたら幸いです。

参考文献

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.